package com.jzo2o.market.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.jzo2o.api.market.dto.request.CouponUseBackReqDTO;
import com.jzo2o.api.market.dto.request.CouponUseReqDTO;
import com.jzo2o.api.market.dto.response.AvailableCouponsResDTO;
import com.jzo2o.api.market.dto.response.CouponUseResDTO;
import com.jzo2o.common.model.PageResult;
import com.jzo2o.market.model.domain.CouponUser;
import com.jzo2o.market.model.dto.request.CouponOperationPageQueryReqDTO;
import com.jzo2o.market.model.dto.request.CouponRedeemReqDTO;
import com.jzo2o.market.model.dto.request.SeizeCouponReqDTO;
import com.jzo2o.market.model.dto.response.CouponUserInfoResDTO;

import java.math.BigDecimal;
import java.util.List;

/**
 * <p>
 * 服务类
 * </p>
 *
 * @author itcast
 * @since 2023-09-16
 */
public interface ICouponUserService extends IService<CouponUser> {

    /**
     * 运营端查询同一个活动的优惠券
     *
     * @param couponOperationPageQueryReqDTO
     * @return
     */
    PageResult<CouponUserInfoResDTO> queryForPageOfOperation(CouponOperationPageQueryReqDTO couponOperationPageQueryReqDTO);

    /**
     * 滚动查询用户优惠券列表
     *
     * @param lastId 上一批查询最后一条优惠券的id
     * @param userId 查询用户的id
     * @param status 优惠券状态
     * @return 优惠券列表
     */
    List<CouponUserInfoResDTO> queryForList(Long lastId, Long userId, Integer status);

    /**
     * 抢券
     *
     * @param seizeCouponReqDTO
     */
    void seizeCoupon(SeizeCouponReqDTO seizeCouponReqDTO);

    /**
     * 获取可用优惠券列表
     *
     * @param totalAmount
     * @return
     */
    List<AvailableCouponsResDTO> getAvailable(BigDecimal totalAmount, Long userId);

    /**
     * 使用优惠券
     *
     * @param couponUseReqDTO
     */
    CouponUseResDTO use(CouponUseReqDTO couponUseReqDTO);

    /**
     * 优惠券回退逻辑，并且
     *
     * @param couponUseBackReqDTO
     */
    void useBack(CouponUseBackReqDTO couponUseBackReqDTO);

    /**
     * 作废指定活动未使用的优惠券
     *
     * @param couponId
     */
    void revoke(Long couponId);

    /**
     * 统计获取优惠券领取数量
     *
     * @param couponId
     * @return
     */
    Integer countReceiveNumByCouponId(Long couponId);

    /**
     * 过期优惠券处理
     */
    void processExpireCoupon();

    /**
     * 兑换优惠券
     *
     * @param couponRedeemReqDTO 优惠券兑换请求模型
     */
    void redeemCoupon(CouponRedeemReqDTO couponRedeemReqDTO);
}
